# 函数返回值
# 函数并非总是直接显示输出，它还可以处理一些数据，并返回一个或一组值。
# 函数返回的值称为返回值 。在函数中，可使用return语句将值返回到调用函数的代码行。
# 返回值让你能够将程序的大部分繁重工作移到函数中去完成，从而简化主程序。

# 返回简单值
# 一个接受名和姓并返回整洁的姓名的函数： formatted_name.py
def get_formatted_name(first_name, last_name):
	"""返回整洁的姓名"""
	full_name = f"{first_name} {last_name}"
	return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)
# 在需要分别存储大量名和姓的大型程序中，像get_formatted_name() 这样的函数非常有用。
# 可以分别存储名和姓，每当需要显示姓名时都调用这个函数。


# 让实参变成可选的
# 有时候，需要让实参变成可选的，这样使用函数的人就能只在必要
# 时提供额外的信息。可使用默认值来让实参变成可选的。
# 例如，假设要扩展函数get_formatted_name() ，使其同时处理中间名。
# 为此，可将其修改成类似于下面这样：
def get_formatted_name(first_name, middle_name, last_name):
	"""返回整洁的姓名"""
	full_name = f"{first_name} {middle_name} {last_name}"
	return full_name.title()

musician = get_formatted_name('john', 'lee', 'hooker')
print(musician)
# 只要同时提供名、中间名和姓，这个函数就能正确运行。它根据这
# 三部分创建一个字符串，在适当的地方加上空格，并将结果转换为首字母大写格式

# 并非所有的人都有中间名，但如果调用这个函数时只提供了名和姓，它将不能正确运行。
# 为了让中间名变成可选的，可给形参middle_name 指定一个空的默认值，并在用户没有提供中间名时不使用这个形参。
# 为让get_formatted_name() 在没有提供中间名时依然可行，可将形参middle_name 的默认值设置为空字符
# 串，并将其移到形参列表的末尾:
def get_formatted_name(first_name, last_name, middle_name=''):
	"""返回整洁的姓名"""
	if middle_name:
		full_name = f"{first_name} {middle_name} {last_name}"
	else:
		full_name = f"{first_name} {last_name}"
	return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)

musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
# 这个修改后的版本不仅适用于只有名和姓的人，而且适用于还有中间名的人


# 返回字典
# 函数可返回任何类型的值，包括列表和字典等较复杂的数据结构。
# 例如，下面的函数接受姓名的组成部分，并返回一个表示人的字典:person.py
def build_person(first_name, last_name):
	"""返回一个字典，其中包含有关一个人的信息"""
	person = {'first': first_name, 'last': last_name}
	return person

musician = build_person("jimi", 'hendrix')
print(musician)

# 下面的修改还能储存年龄
def build_person(first_name, last_name, age=None):
	"""返回一个字典，其中包含有关一个人的信息。"""
	person = {'first': first_name, 'last': last_name}
	if age:
		person['age'] = age
	return person

musician = build_person('jimi', 'hendrix', age=27)
print(musician)
# 在函数定义中，新增了一个可选形参age ，并将其默认值设置为特
# 殊值None （表示变量没有值）。可将None 视为占位值。在条件测
# 试中，None 相当于False 。如果函数调用中包含形参age 的值，
# 这个值将被存储到字典中。在任何情况下，这个函数都会存储人的
# 姓名，但可进行修改，使其同时存储有关人的其他信息


# 结合使用函数和while 循环
# 可将函数同本书前面介绍的任何Python结构结合起来使用。
# 例如，下面将结合使用函数get_formatted_name() 和while 循环，以更正式的方式问候用户。
# 下面尝试使用名和姓跟用户打招呼greeter.py
def get_formatted_name(first_name, last_name):
	"""返回整洁的姓名"""
	full_name = f"{first_name} {last_name}"
	return full_name.title()

# 这是一个无限循环
while True:
	print("\nPlease tell me your name:")
	print("(enter 'q' at any time to quit)")
	f_name = input("First_name: ")
	if f_name == 'q':
		break
	l_name = input("Last_name: ")
	if l_name == 'q':
		break

	formatted_name = get_formatted_name(f_name, l_name)
	print(f"\nHello, {formatted_name}!")
